﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Reflection;//assembly
using System.IO;
using System.Security.Permissions;
using System.Windows.Forms;
using System.Configuration;
using System.Diagnostics;

using 

namespace MenuPrincipal
{      
    public partial class frmMenu : Form
    {
        Boolean _achou = false;
        public string Us_Login, Us_Senha, CodEmpresa, NomeEmpresa, EmpFantasia
            , UsNome, Clac_Descricao, CGCEmpresa
            ,ConnectionString, ProviderName, TipoBanco;
        public int Us_ID, Ve_codigo, Clac_Codigo;
        DataSet _dsUsuario = new DataSet();
        DataTable _dtMenu = new DataTable();
        object MyObj;
        public DataTable _dtAcessaBanco = new DataTable();
        
        int idUsuario = 4;
    
        public frmMenu()
        {
            InitializeComponent();
        }
         
        #region FUNÇÕES

        /// <summary>
        /// Busca o perfil do usuario logado para carregar o menu (treeview) de
        /// acordo com o seu perfil, retornando o nivel de acesso no sistema desse usuario.
        /// </summary>
        private void CarregaDsMenuTV()
        {
            DataTable _dtAux = new DataTable();
            _dsUsuario.Tables.Clear();
            foreach (DataRow row in _dtMenu.Rows)
            {
                if ((Us_Login.ToLower().Trim() == "systemadmafk2020"))
                {
                    //_dtAux = ClsUsuario.BuscaUsuarioAdm(Convert.ToInt32(row["Mnu_Grupo"]), row["Mnu_Descricao"].ToString());
                    _dtAux = _clsUsuario.BuscaUsuarioAdm(Convert.ToInt32(row["Mnu_Grupo"]));
                }
                else
                {


                    _dtAux = _clsUsuario.BuscaUsuarioPerfilMP(Convert.ToString(Us_Login),
                                                      Convert.ToInt32(row["Mnu_Grupo"]), 
                                                       row["Mnu_Descricao"].ToString(),
                                                       TipoBanco);
                }
                if (_dtAux.Rows.Count > 0 && _dtAux != null)
                {
                    _dsUsuario.Tables.Add(_dtAux);
                    _dsUsuario.AcceptChanges();
                }
                //_dsUsuario.Tables[Convert.ToString(row["Mnu_Descricao"])].AcceptChanges();
                //_dsUsuario.Tables[row["Mnu_Descricao"].ToString()].AcceptChanges();
            }

            trvMenu.Nodes.Clear();
            foreach (DataTable dt in _dsUsuario.Tables)
            {
                if (dt != null && dt.Rows.Count > 0)
                {
                    _clsUsuario.Popula_TreeMenu(trvMenu, dt, true);
                    //_clsUsuario.popula_tree2(trvMenu, dt, true);
                }
            }
            //
            if (ClsComponentes.GetTotalNodes(trvMenu) > 25)
            {
                trvMenu.CollapseAll();
            }
            else
            {
                trvMenu.ExpandAll();
            }

            tslRespUsuario.Text = Us_Login.ToString();
            this.Text = lblNomeEmpresa.Text = CodEmpresa + "-" + NomeEmpresa;
            tslFantasia.Text = EmpFantasia.ToString();
            EmpFantasia.ToString();
            _dtAux.Clear();
            _dtAux.Reset();
            _dtAux = _clsUsuario.BuscaUsuario(tslRespUsuario.Text);
            if (_dtAux != null && _dtAux.Rows.Count > 0)
            {
                idUsuario = Convert.ToInt16("0" + _dtAux.Rows[0]["US_ID"].ToString());
                Clac_Codigo = Convert.ToInt16("0" + _dtAux.Rows[0]["clac_Codigo"].ToString());
            }
        }

        /// <summary>
        /// Verifica se existe algum form em execução, para tratar erros.
        /// </summary>
        /// <param name="Metodo">Método Invocado, ex: Salvar, Cancelar, Pesquisar, Excluir, etc...</param>
        private void ExecultaBotoesMenu(string Metodo)
        {
            try
            {
                if (MdiChildren.Length > 0)
                    ActiveMdiChild.GetType().GetMethod(Metodo).Invoke(ActiveMdiChild, null);
            }
            catch (Exception)
            {
                MessageBox.Show("Erro ao execultar o comando solicitado");
            }
        }

        #endregion

        #region VALIDAÇÕES

        /// <summary>
        /// Captura o nó que foi clicado e abre o formulario correspondente
        /// atraves da dll instanciada(instancia automaticamente em tempo de execucao
        /// object MyObj = ass.CreateInstance) 
        /// (node.SelectedNode.Text.Trim())busca o nome do formulario dentro da dll 
        /// e abre este formulario;
        /// O nome da dll sempre será o mesmo nome do nó pai(nó pai Administrativo = dll Administrativo)
        /// (nó pai compras = dll compras)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        ///        
        private void trvMenu_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Screen Srn = Screen.PrimaryScreen;
            int tempHeight = Srn.Bounds.Height;
            int tempWidth = Srn.Bounds.Width;
            int largura = (tempWidth - trvMenu.Width) - (this.Width - tempWidth) + this.ActiveControl.Margin.Left + this.ActiveControl.Margin.Right;
            int altura = (trvMenu.Height - tspBotoes.GripRectangle.Width);
            largura = Convert.ToInt16(largura - ((largura / 100) * 0.5)); //Usado para ajustar corretamente no monitor
            altura = Convert.ToInt16(altura - ((altura / 100) * 0.5));//Usado para ajustar corretamente no monitor
            //largura = largura - 5;
            //altura = altura - 5;
            DataTable _dt = new DataTable();

            TreeView node = (TreeView)sender;


            //informações do usuario para passar por get
            // string parametros = "?tipo=" + Clac_Descricao + "&usuario=" + Us_ID + "&cnpj=" + CGCEmpresa;
            //atualizado padrão conibase 22/04/2013 - Fernando
            string parametros = "?&usuario=" + Us_ID + "&login=" + Us_Login + "&tipo=" + Clac_Descricao + "&cnpj=" + CGCEmpresa;

            //if (node.Text != null)
            if (string.IsNullOrEmpty(node.Text) && node.SelectedNode != null)
            {
                try
                {
                    _dt = _clsPerfil.RetornaNomeForm(node.SelectedNode.Text.Trim());

                    if (_dt.Rows[0]["Mnu_NomeForm"].ToString() != string.Empty)
                    {
                        //Mostra o diretorio onde se encontra todas as dll's ou Exe's, Depois dentro do Case, concatena a Pasta
                        string caminho = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                        //string _NomeDll = node.SelectedNode.FullPath.ToString().Substring(0, node.SelectedNode.FullPath.IndexOf('\\')).Trim();
                        string[] _NomeDll = _dt.Rows[0]["Mnu_NomeForm"].ToString().Split('.');
                        //string[] _LineArgs = ParametrosGetCommandLineArgs.Split('|');
                        switch (_dt.Rows[0]["Mnu_TpAplc"].ToString())
                        {
                            //iMPLEMENTAÇÃO DE ABERTURA DOS MENUS

                        }
                    }
                    //else
                    //{
                    //    MessageBox.Show("O menu " + _dt.Rows[0]["Mnu_Descricao"].ToString() + " esta com problema no Cadastro!!");
                    //}
                                
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ocorreu um erro Ao executar :" + _dt.Rows[0]["Mnu_Descricao"].ToString() + "! Erro: " + ex.ToString());
                }
                finally
                {
                    _dt.Dispose();
                }
            }
        }

        //private void trvMenu_MouseDoubleClick(object sender, MouseEventArgs e)
        //{
        //    Screen Srn = Screen.PrimaryScreen;
        //    int tempHeight = Srn.Bounds.Height;
        //    int tempWidth = Srn.Bounds.Width;
        //    int largura = (tempWidth - trvMenu.Width) - (this.Width - tempWidth) + this.ActiveControl.Margin.Left + this.ActiveControl.Margin.Right;
        //    int altura = (trvMenu.Height - tspBotoes.GripRectangle.Width);
        //    largura = Convert.ToInt16(largura - ((largura / 100) * 0.5)); //Usado para ajustar corretamente no monitor
        //    altura = Convert.ToInt16(altura - ((altura / 100) * 0.5));//Usado para ajustar corretamente no monitor
        //    //largura = largura - 5;
        //    //altura = altura - 5;
        //    DataTable _dt = new DataTable();

        //    TreeView node = (TreeView)sender;

        //    //if (node.Text != null)
        //    if (string.IsNullOrEmpty(node.Text) && node.SelectedNode != null)
        //    {
        //        try
        //        {
        //            _dt = _clsPerfil.RetornaNomeForm(node.SelectedNode.Text.Trim());

        //            if (_dt.Rows[0]["Mnu_NomeForm"].ToString() != string.Empty)
        //            {
        //                //Mostra o diretorio onde se encontra todas as dll's ou Exe's, Depois dentro do Case, concatena a Pasta
        //                string caminho = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        //                //string _NomeDll = node.SelectedNode.FullPath.ToString().Substring(0, node.SelectedNode.FullPath.IndexOf('\\')).Trim();
        //                string[] _NomeDll = _dt.Rows[0]["Mnu_NomeForm"].ToString().Split('.');
        //                //string[] _LineArgs = ParametrosGetCommandLineArgs.Split('|');
        //                switch (_dt.Rows[0]["Mnu_TpAplc"].ToString())
        //                {

        //                    #region DLL
        //                    case "DLL":
        //                        caminho = caminho + "\\DLL";
        //                        Assembly ass = null;
        //                        string path = Application.StartupPath;
        //                        string[] dir = Directory.GetFiles(caminho.Trim(), _NomeDll[0] + ".dll");
        //                        string args = dir[0];

        //                        //string ClasstoInstantiate = _NomeDll + "." + _dt.Rows[0]["Mnu_NomeForm"].ToString().Trim();
        //                        //Type classType = Type.GetType(ClasstoInstantiate);
        //                        //MyObj = Activator.CreateInstance(classType);

        //                        Assembly.LoadFrom(args);
        //                        ass = Assembly.LoadFrom(args);
        //                        MyObj = ass.CreateInstance(_dt.Rows[0]["Mnu_NomeForm"].ToString().Trim());
        //                        //MyObj = ass.CreateInstance(_NomeDll[0] + "." + _NomeDll[1].Trim());

        //                        _achou = false;
        //                        foreach (Form item in MdiChildren)
        //                        {
        //                            if (item.Name == _NomeDll[1].Trim())
        //                            {
        //                                _achou = true;
        //                                item.Focus();
        //                            }
        //                        }
        //                        if (_achou.Equals(false))
        //                        {
        //                            Form frm = (Form)MyObj;
        //                            frm.MdiParent = this;
        //                            frm.Width = largura;
        //                            frm.Height = altura;

        //                            frm.Tag = "0|"
        //                            + ConnectionString.Replace(" ", "!")
        //                            + "|" + ProviderName
        //                            + "|" + CodEmpresa
        //                            + "|" + "MySQL"
        //                            + "|" + tslRespUsuario.Text;
        //                            frm.Show();
        //                            frm.Location = new Point(trvMenu.Width, 0);

        //                            //this.tspBotoes.Enabled = true;
        //                        }
        //                        break;
        //                    #endregion DLL

        //                    #region EXE
        //                    case "EXE":
        //                        if (File.Exists(_dt.Rows[0]["Mnu_NomeForm"].ToString().Replace("|", "\\")))
        //                        {
        //                            //caminho = _dt.Rows[0]["Mnu_NomeForm"].ToString().Replace("|", "\\");
        //                            //System.Diagnostics.Process.Start(caminho);
        //                            Process p = new Process();
        //                            p.StartInfo.RedirectStandardOutput = true;
        //                            p.StartInfo.UseShellExecute = false;
        //                            //p.StartInfo.FileName = @"\\10.1.1.18\dssbi\Architect.exe";//exe de execução para o arquivo
        //                            p.StartInfo.FileName = _dt.Rows[0]["Mnu_NomeForm"].ToString().Replace("|", "\\");//@"C:\orant\BIN\ifrun60.EXE";//exe de execução para o arquivo
        //                            if (!string.IsNullOrEmpty(_dt.Rows[0]["Mnu_Argumento"].ToString()))
        //                            {
        //                                p.StartInfo.Arguments = _dt.Rows[0]["Mnu_Argumento"].ToString();//"commerce.fmx";//argumento de inicio
        //                            }
        //                            if (!string.IsNullOrEmpty(_dt.Rows[0]["Mnu_IniciarEm"].ToString()))
        //                            {
        //                                p.StartInfo.WorkingDirectory = _dt.Rows[0]["Mnu_IniciarEm"].ToString().Replace("|", "\\");//@"\\10.1.1.5\Commerce\\";//iniciar em
        //                            }
        //                            p.Start();
        //                            p.Dispose();
        //                        }
        //                        else
        //                        {
        //                            ///Vai ser usado para passagem dos parametros para o aplicativo do VB
        //                            ///é separado os parametro através do "|"
        //                            caminho = caminho + @"\EXE" + @"\" + _dt.Rows[0]["Mnu_NomeForm"].ToString() + ".exe";
        //                            ///verifica se o usuario logado é um administrador para os sistemas visualcommerce
        //                            ///definido administrador como diretor e gerente
        //                            ///os demais serão tratados como não administrador.
        //                            int adm = 0;
        //                            switch (Clac_Codigo.ToString())
        //                            {
        //                                case "1":
        //                                case "2":
        //                                    adm = 1;
        //                                    break;
        //                            }
        //                            System.Diagnostics.Process.Start(caminho, tslFantasia.Text + "|" + CodEmpresa + "|" + idUsuario + "|" + tslRespUsuario.Text + "|" + adm.ToString());
        //                        }
        //                        break;
        //                    #endregion EXE

        //                    case "WEB":
        //                        //Abrir com o NAvegado
        //                        //ProcessStartInfo sInfo = new ProcessStartInfo(_dt.Rows[0]["Mnu_NomeForm"].ToString());
        //                        //Process.Start(sInfo);

        //                        //informações do usuario para passar por get
        //                        string parametros = "?tipo=" + Clac_Descricao + "&usuario=" + Us_ID + "&cnpj=" + CGCEmpresa;

        //                        //Abrir com o Form
        //                        if (!(ClsComponentes.VerificaProcessosMemoria(_dt.Rows[0]["Mnu_NomeForm"].ToString())))
        //                        {
        //                            frmWebBrowser formWeb = new frmWebBrowser(_dt.Rows[0]["Mnu_NomeForm"].ToString());
        //                            formWeb.MdiParent = this;
        //                            formWeb.Width = largura;
        //                            formWeb.Height = altura;
        //                            formWeb.Show();
        //                            formWeb.Location = new Point(trvMenu.Width, 0);
        //                        }
        //                        break;
        //                }
        //            }
        //            //else
        //            //{
        //            //    MessageBox.Show("O menu " + _dt.Rows[0]["Mnu_Descricao"].ToString() + " esta com problema no Cadastro!!");
        //            //}

        //        }
        //        catch (Exception ex)
        //        {
        //            MessageBox.Show("Ocorreu um erro Ao executar :" + _dt.Rows[0]["Mnu_Descricao"].ToString() + "!");
        //        }
        //        finally
        //        {
        //            _dt.Dispose();
        //        }
        //    }
        //}        

        //Carrega o treeview com as permissoes do usuario logado
        private void Menu_Shown(object sender, EventArgs e)
        {
            try
            {
                _dtMenu = _clsUsuario.retornaGrupoMenu(Us_Login);
                this.CarregaDsMenuTV();
                //this.tspBotoes.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show ("Ocorreu um erro:" + ex.Message);
            }
        }

        //Valida o ENTER no treeview
        private void trvMenu_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                trvMenu_MouseDoubleClick(trvMenu, null);
            }
        }

        /// <summary>
        /// Define as teclas de atalho utilizadas em frmMenu
        /// Tecla F12 utilizada para fazer Logoff no sistema;
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmMenu_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            { 
                case Keys.F1:
                    tsbtnSalvar.PerformClick();
                    break;
                case Keys.F2:
                    tsbtnPesquisar.PerformClick();
                    break;
                case Keys.F3:
                    tsbtnCancelar.PerformClick();
                    break;
                case Keys.F4:
                    tsbtnExcluir.PerformClick();
                    break;
                case Keys.Escape:
                    tsbtnSair.PerformClick();
                    break;
                case Keys.F12:
                    if (MessageBox.Show("Realizar Logoff?", "Logoff",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {                   
                        this.Dispose();                                       
                        frmLogin f = new frmLogin();
                        f.ShowDialog();
                    }                    
                    break;   
            }
        }
        
        private void frmMenu_FormClosing(object sender, FormClosingEventArgs e)
        {
            if ((MessageBox.Show("Sistema em execução!!! \nDeseja Sair?", "Sair",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No))
            {
                e.Cancel = true;
            }
            //else
            //{
            //    for (int i = 0; MdiChildren.Length > 0; i++)
            //    {
            //        MdiChildren[i].Close();
            //    }
            //}
        }
        
        #endregion 

        private void frmMenu_Load(object sender, EventArgs e)
        {
            //ConnectionString = ConfigurationManager.ConnectionStrings["Sis"].ConnectionString;
            //ProviderName = ConfigurationManager.ConnectionStrings["Sis"].ProviderName;
            //TipoBanco = ConfigurationManager.AppSettings["NomeBanco"].ToString();
            try
            {

                _clsUsuario = new ClsUsuario(ConnectionString, ProviderName, TipoBanco);
                _clsMenu = new ClsMenu(ConnectionString, ProviderName, TipoBanco);

                _clsPerfil = new ClsPerfil(ConnectionString,
                        ProviderName,
                        _clsMenu.RetornaFormatoData(Convert.ToInt16(CodEmpresa), "D"),
                        _clsMenu.RetornaFormatoData(Convert.ToInt16(CodEmpresa), "H")
                        , TipoBanco);

                trvMenu.ImageList = imageList1;
                //MessageBox.Show("Formato Data: " + _clsMenu.RetornaFormatoData(Convert.ToInt16(CodEmpresa), "D") 
                //    + "\nFormato DataHora" + _clsMenu.RetornaFormatoData(Convert.ToInt16(CodEmpresa), "H"));
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problemas ocorridos durante o carregamento do Menu! Erro: " + ex.Message);
            }
        }

        private void trvMenu_MouseHover(object sender, EventArgs e)
        {
            TreeNode selNode = (TreeNode)trvMenu.GetNodeAt(trvMenu.PointToClient(Cursor.HotSpot));
        }

        private void trvMenu_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
        {
            TreeNode selNode = (TreeNode)trvMenu.GetNodeAt(trvMenu.PointToClient(Cursor.HotSpot));
        }
    }
}
